var siteUrl;

$(function() {
    siteUrl = $("#site_url").val(); // header.php

    /* ajax请求 登录提示 */
    $( document ).ajaxError(function(event, jqxhr) {
        if (jqxhr.status == 401) {
            jqEl = $(jqxhr.responseText);
            jqEl.dialog({
                title: "重新登录",
                modal: true,
                buttons: [{
                    text: '登录',
                    click: function() {
                        window.location.href = jqEl.find("input[type=hidden]").val();
                    }
                }]
            });
        }
    });
});


/**
 * 文件上传组件，需要用到jquery ui的dialog组件
 * 绑定element的click事件
 * 上传后可以返回上传文件的原始文件名和上传后文件路径
 * <button nameElementId = "file_name" pathElementId = "file_path" onclick="yeFileUpload({url: 'upload.php'});">上传文件<button>
 * <input id="file_name" />
 * <input id="file_path" />
 * 
 * @param url 处理ajax上传的url
 * @param nameAttr 存放原始文件名的element的id保存在哪个属性中,this表示当前element
 * @param pathAttr 存放上传后文件路径的element的id保存在哪个属性中，next表示下一个element
 * @param maxSize 上传文件大小最大值，单位KB或MB
 * @param allowedTypes 允许上传文件类型
 * @returns
 */
(function($){
    $.fn.yeFileUpload = function(options) {
        
        /* 参数 */
        var defaults = {
                url: '',
                nameAttr: 'nameElementId',
                pathAttr: 'pathElementId',
                maxSize: '1MB',
                allowedTypes: 'gif|jpg|jpeg|png'
        };
        var opts = $.extend(defaults, options);

        /* 返回值要写入的element */
        var nameElement, pathElement;
        
        /* 对话框内容 */
        var fileElementId = 'upload_dialog_user_file' + Math.ceil(Math.random() * 10000);
        var content = $('<div><p>请选择一个文件（大小不超过' + opts.maxSize + '，格式' + opts.allowedTypes + '），然后点击上传按钮。</p>\
<input type="file" id="' + fileElementId + '" name="' + fileElementId + '" /></div>');
        
        content.dialog({
            autoOpen: false,
            title: "文件上传",
            resizable: false,
            buttons: [{
                text: "上传",
                click: function() {
                    $.ajaxFileUpload({
                        url: opts.url,
                        secureuri:false,
                        fileElementId:fileElementId,
                        dataType: 'json',
                        data: {
                            max_size: opts.maxSize,
                            allowed_types: opts.allowedTypes,
                            file_element_id: fileElementId
                        },
                        success: function(data) {
                            if(typeof(data.error) !== 'undefined') {
                                if(data.error !== '') {
                                    alert(data.error);
                                } else {
                                    nameElement.val(data.upload_data.orig_name);
                                    pathElement.val(data.upload_data.encode_path);
                
                                    content.dialog("close");
                                }
                            }
                        },
                        error: function(data, status, e) {
                            alert(e);
                        }
                    });
                }
            }, {
                text: "取消",
                click: function() {
                    $(this).dialog("close");
                }
            }]
        });
        
        /* 点击其他地方，关闭对话框 */
        $(document).click(function() {
            if (content.dialog('isOpen')) {
                content.dialog('close');
            }
        });
        
        /* 点击对话框，阻止事件向上响应 */
        content.parent().click(function(event) {
            event.stopPropagation();
        });

        /* 返回jquery对象 */
        return this.each(function() {
            $(this).click(function(event) {
                event.stopPropagation();
                
                if (opts.nameAttr === 'this') {
                    nameElement = $(this);
                } else {
                    nameElement = $("#" + $(this).attr(opts.nameAttr));
                }
                if (opts.pathAttr === 'next') {
                    pathElement = nameElement.next();
                } else {
                    pathElement = $("#" + $(this).attr(opts.pathAttr));
                }

                /* 定位对话框 */
                content.dialog('option', 'position', {my: "left top", at: "left bottom", of: this});
                
                /* 打开对话框 */
                if (!content.dialog('isOpen')) {
                    content.dialog('open');
                }
            });
        });
    };
}(jQuery));


/**
 * 可编辑表格
 * @param data 初始值 二维数组
 * @param oncellexit 回调函数 焦点离开单元格时调用
 */
(function($){
    $.fn.yeEditableTable = function(data, oncellexit) {
        
        /* 正在编辑的单元格和表单元素 */
        var activeCell = null;
        var activeElement = null;
        
        /* 点击其他地方，退出编辑状态 */
        $(document).click(function(event) {
            exitCurrentCell();
        });
        
        /* 日历组件，阻止事件向上传递 */
        $(document).on("click", "#ui-datepicker-div, .ui-datepicker-header", function(event) {
            event.stopPropagation();
        });

        return this.each(function() {

            /* 填充表格 */
            if (data !== null) {
                for (var i = 0; i < data.length; i++) {
                    appendRow(this, data[i]);
                }
            }
            
            /* 点击单元格，进入编辑状态，并阻止事件向上响应 */
            $(this).on("click", "tbody td[editable]", function(event) {

                if (activeCell !== this) {
                    exitCurrentCell();
                    enterCell(this);
                }
                
                event.stopPropagation();
            });
            
            /* append */
            $(this).on("click", "tfoot button[name=append]", function() {
                appendRow($(this).parents("table"), null);
            });
            
            /* remove */
            $(this).on("click", "tbody button[name=remove]", function() {
                $(this).parents('tr').remove();
            });
        });
        
        /* 追加一行 */
        function appendRow(table, data) {
            var tbody = $(table).find("tbody");
            var tr = tbody.find("tr.hide").clone().removeClass('hide');
            if (data !== null) {
                $.each(data, function(key, value) {
                   tr.find("td[name=" + key + "]").text(value); 
                });
            }
            tr.appendTo(tbody);
        }
        
        /* 进入单元格，开始编辑 */
        function enterCell(cell) {
            activeCell = cell;
            
            switch ($(cell).attr('edittype')) {
                case 'date':
                    activeElement = $('<input value="' + $(cell).text() + '" />');
                    activeElement.datepicker({
                        changeMonth: true,
                        changeYear: true,
                        dateFormat: "yy-mm-dd"
                    });
                    break;
                case 'select':
                    activeElement = $("#" + $(cell).attr('sourceid')).clone()
                        .attr('id', '').attr('name', '').removeClass('hide');
                    break;
                default:
                    activeElement = $('<input value="' + $(cell).text() + '" />');
            }

            /* 按回车退出编辑状态 */
            activeElement.keypress(function(event) {
                if (event.keyCode === 13) {
                    exitCurrentCell();
                    return false;
                }
            });

            $(cell).empty().append(activeElement);
            activeElement.focus();
        }
        
        /* 离开当前单元格 */
        function exitCurrentCell() {
            if (activeCell !== null) {
                $(activeCell).text(activeElement.val());
                activeElement.remove();
                
                if (oncellexit) {
                    oncellexit(activeCell);
                }
                activeCell = null;
            }
        }
    };
}(jQuery));

/**
 * 绑定select
 */
(function($){
    $.fn.yeSelectableInput = function(options, onchange) {
        
        /* 参数 */
        var defaults = {
            selectId: null, // id of select element
            valueOrText: "text" // when select change, fetch value or text of selected item
        };
        var opts = $.extend(defaults, options);

        return this.each(function() {
            var input  = $(this);
            var button = $('<button type="button" id="' + "set_" + input.attr('id') + '">...</button>')
                    .insertAfter(input);
            var select = !opts.selectId ? 
                    $("#" + input.attr('id') + "_id") : 
                    $("#" + opts.selectId).clone().attr('id', '').insertAfter(button);
            
            button.click(function() {
                input.hide();
                button.hide();
                select.show();
            });
            
            select.change(function() {
                if (onchange) {
                    onchange(this);
                }
                
                input.val(opts.valueOrText === 'text' ? select.find("option:selected").text() : select.val());
                select.val('');
                select.hide();
                input.show();
                button.show();
            });
            
        });
    };
}(jQuery));

/* parseFloat, NaN return 0 */
function yeParseFloat(string) {
    var number = parseFloat(string);
    if (isNaN(number)) {
        return 0;
    } else {
        return number;
    }
}

/**
 * 绑定日期选择组件
 * @param selector 选择器
 */
function bindDatepicker(selector) {
    $(selector).datepicker({
        changeMonth: true,
        changeYear: true,
        dateFormat: "yy-mm-dd"
    });
}

/**
 * 绑定文件上传组件
 * @param selector 选择器
 * @param options 
 */
function bindFileUpload(selector, options) {
    var opts = $.extend({url: siteUrl + '/upload/do_upload'}, options);
    $(selector).yeFileUpload(opts);
}